<%@ page language="java" contentType="text/html; charset=utf-8"%>
<%@ page import="java.util.*" %>
<%@ page import="cn.estore.cart.CartGoods" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
<title>cartAdd.jsp</title>
</head>
<body>
<%
try { 
    // 获取request中的商品编号及价格
    int goodsID = Integer.parseInt(request.getParameter("goodsId"));
    float goodsPrice = Float.parseFloat(request.getParameter("price"));
    
    // 定义购买数量变量（buyGoodsNumber），默认每次购买 1 件商品
    int buyGoodsNumber = 1;
    
    // 使用商品 ID、价格、购买数量创建一个购物车商品对象（cartGoods，基于CartGoods类）。
    CartGoods cartGoods = new CartGoods(goodsID, goodsPrice, buyGoodsNumber);
    boolean flag = true;//商品是否在购物车中的标志，默认不在购物车中
    
    /*从会话（session）中获取已有的购物车（_CART_是购物车在 session 中的存储键名），
    购物车使用 Vector 集合存储。*/
    Vector cart = (Vector) session.getAttribute("_CART_");
    if (cart == null) {
        cart = new Vector();//如果购物车不存在（cart == null），则新建一个空的 Vector 作为购物车。
    } else {
        // 检查商品是否已在购物车中，已存在则数量+1
        for (int i = 0; i < cart.size(); i++) {
        	//遍历购物车（cart）中的所有商品，cart.elementAt(i) 是 Java 中 Vector 集合的一个方法，用于获取集合中指定索引位置的商品。每次取出购物车中的一个商品（boughtGoods）
        	CartGoods boughtGoods = (CartGoods) cart.elementAt(i);
        	
            if (boughtGoods.ID == cartGoods.ID) {
                boughtGoods.number++;
                cart.setElementAt(boughtGoods, i);//更新购物车中该商品的信息（setElementAt），把更新后的商品对象重新放回到购物车中原来的位置（索引 i）。
                flag = false;
                break; // 找到后跳出循环，避免无效遍历
            }
        }
    }
    
    // 新商品添加到购物车
    if (flag) {
        cart.add(cartGoods);//add是 Vector 集合的方法，用于将新商品添加到购物车的末尾，是 “购物车中不存在当前商品时” 的核心操作。
    }
    
    //用于将购物车数据保存到用户会话Session中，"_CART_"：存储购物车的 “键名”（相当于给购物车数据起一个唯一的名字），cart为要存入会话的购物车数据（Vector集合，包含用户添加的所有商品信息）。
    session.setAttribute("_CART_", cart); 
    
    // 输出成功提示
    out.println("<script language='javascript'> alert('商品成功加入购物车!'); window.close(); </script>");//通过out.println输出 JavaScript 代码：弹出提示框（alert），关闭当前窗口（window.close()）。
} catch (Exception e) { // catch必须跟在try后面
    // 异常处理：提示错误信息
    out.println("<script language='javascript'> alert('添加失败：" + e.getMessage() + "'); window.close(); </script>");
}
%>
</body>
</html>
